/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package utils.facade;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import javax.swing.JPanel;
import models.Atividade;
import models.Projeto;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.annotations.XYLineAnnotation;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.NumberTickUnit;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import utils.DataUtils;

/**
 *
 * @author Oliver Kraemer
 */
public class GerarGrafico {
    
    private JPanel panel;
    private Projeto projeto;

    public GerarGrafico(JPanel panel, Projeto projeto) {
        this.panel = panel;
        this.projeto = projeto;
    }
    
    public void geraGrafico() {
        ArrayList<Atividade> atividades = this.projeto.getAtividades();
        Collections.sort(atividades);

        int quantidade_atividades = atividades.size();
        int quantidade_dias = this.projeto.getQuantidadeDias();

        if ( DataUtils.DiferencaData(this.projeto.getDataInicio()) > quantidade_dias ) {
            quantidade_dias = DataUtils.DiferencaData(this.projeto.getDataInicio());
        }
        

        XYSeriesCollection dataset1 = new XYSeriesCollection();

        XYSeries serie1 = new XYSeries("Atividades/Dias", false);

        System.out.println("-------------------------------------------------");
        for (Atividade atividade : atividades) {
            System.out.println(atividade.getDataConclusao());
        }
        
        serie1.add(0, 0);
        boolean projeto_concluido = true;
        Date data_ultima_atividade = null;

        for ( int nr_atividade_atual = 0, atividade_dias_atual, atividade_dias_proxima, atividade_dias_anterior, nro_atividade_anterior = 0; nr_atividade_atual < atividades.size(); nr_atividade_atual++ ) {
            data_ultima_atividade = atividades.get(nr_atividade_atual).getDataConclusao();

            if ( data_ultima_atividade == null ) {
                projeto_concluido = false;
                serie1.add(nro_atividade_anterior, DataUtils.DiferencaData(projeto.getDataInicio()) );

                break;
            }
            
            //Atual = Diferença de dias em relação a data de início do projeto e conclusão da atividade
            atividade_dias_atual = DataUtils.DiferencaData(atividades.get(nr_atividade_atual).getDataConclusao(), projeto.getDataInicio());
            
            if ( nr_atividade_atual+1 == atividades.size() || atividades.get(nr_atividade_atual+1).getDataConclusao() == null) {
                atividade_dias_proxima = -1;
            } else {
                atividade_dias_proxima = DataUtils.DiferencaData(atividades.get(nr_atividade_atual+1).getDataConclusao(), projeto.getDataInicio());
            }

            if ( atividade_dias_atual != atividade_dias_proxima ) {
                if ( nr_atividade_atual > 0 ) {
                    atividade_dias_anterior = DataUtils.DiferencaData(atividades.get(nr_atividade_atual-1).getDataConclusao(), projeto.getDataInicio());
                    
                    if ( atividade_dias_atual-atividade_dias_anterior != 1 ) {
                        serie1.add( nro_atividade_anterior, atividade_dias_atual-1 );
                    }
                }

                serie1.add( nr_atividade_atual+1, atividade_dias_atual );

                nro_atividade_anterior = nr_atividade_atual+1;
            }
        }

        dataset1.addSeries(serie1);

        JFreeChart chart = ChartFactory.createXYLineChart("Burn-Down", "Atividades", "Dias", dataset1, PlotOrientation.HORIZONTAL, false, true, false);

        XYLineAnnotation annotation = new XYLineAnnotation(0, 0, quantidade_atividades, this.projeto.getQuantidadeDias());
        
        if ( projeto_concluido ) {
            quantidade_dias = DataUtils.DiferencaData(data_ultima_atividade, this.projeto.getDataInicio());
        }

        XYPlot xyPlot = (XYPlot) chart.getPlot();

        xyPlot.getRendererForDataset(dataset1).addAnnotation(annotation);

//        XYItemRenderer renderer = xyPlot.getRenderer();
        NumberAxis domain = (NumberAxis) xyPlot.getDomainAxis();
        NumberAxis range = (NumberAxis) xyPlot.getRangeAxis();

        // Define que o gráfico terá 20 atividades
        domain.setRange(0, quantidade_atividades);
        domain.setTickUnit(new NumberTickUnit(1));
        domain.setInverted(true);

        range.setRange(0, quantidade_dias);
        range.setTickUnit(new NumberTickUnit(1));

        xyPlot.setBackgroundPaint(Color.WHITE);
        xyPlot.setRangeGridlinePaint(Color.LIGHT_GRAY); // Cor das Linhas X (Verticais)
        xyPlot.setDomainGridlinePaint(Color.LIGHT_GRAY); // Cor das Linhas Y (Horizontais)
        xyPlot.setOutlinePaint(Color.LIGHT_GRAY); // Cor da "borda" do gráfico

        final XYItemRenderer renderer1 = xyPlot.getRenderer();
        renderer1.setSeriesPaint(0, Color.RED);
        renderer1.setSeriesPaint(1, Color.RED);

        final ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new Dimension(500,270));

        this.panel.setLayout(new BorderLayout());
        this.panel.removeAll();
        this.panel.add(chartPanel, BorderLayout.NORTH);
        this.panel.revalidate();
        this.panel.repaint();
    }
    
}
